/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import exception.DuplicateConstraintException;
import exception.RemoveConstraintException;
import java.util.List;
import javax.annotation.security.PermitAll;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.validation.ConstraintViolationException;
import model.entidades.Ficha;
import model.entidades.Lote;

/**
 *
 * @author helton
 */
@Named
@Stateless
@PermitAll
public class FichaDao {

    @PersistenceContext
    private EntityManager em;

    public void insert(Ficha ficha) throws DuplicateConstraintException {
        try {
            em.persist(ficha);
            em.flush();
        } catch (Exception e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                throw new DuplicateConstraintException("Nome", ficha.getNome());
            }
        }
    }

    public Ficha update(Ficha ficha) throws DuplicateConstraintException {
        try {
            ficha = em.merge(ficha);
            em.flush();
        } catch (Exception e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                throw new DuplicateConstraintException("Nome", ficha.getNome());
            }
        }
        return ficha;
    }

    public void delete(Ficha ficha) throws RemoveConstraintException {
        try {
            ficha = em.merge(ficha);
            em.remove(ficha);
            em.flush();
        } catch (Exception e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                throw new RemoveConstraintException();
            }
        }
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Ficha findById(Object id) {
        return em.find(Ficha.class, id);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Ficha> getAll() {
        /*CriteriaBuilder cb = em.getCriteriaBuilder();
         CriteriaQuery<Ficha> cq = cb.createQuery(Ficha.class);
         Root<Ficha> fichas = cq.from(Ficha.class);
         cq.select(fichas);
         return em.createQuery(cq).getResultList();*/
        Query q = em.createQuery("SELECT fichas from Ficha as fichas ORDER BY fichas.id DESC");
        return q.getResultList();
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Ficha> listFichas() {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Ficha> cq = cb.createQuery(Ficha.class);
        Root<Ficha> fichas = cq.from(Ficha.class);
        cq.select(fichas);

        Predicate predicate = cb.equal(fichas.get("status"), "Não Enviado");
        cq.where(predicate);
        TypedQuery<Ficha> query = em.createQuery(cq);
        return query.getResultList();
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Ficha> printFichas(Lote lote) {
        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Ficha> cq = cb.createQuery(Ficha.class);
            Root<Ficha> fichas = cq.from(Ficha.class);
            cq.select(fichas);

            Predicate predicate = cb.equal(fichas.get("lote"), lote);
            cq.where(predicate);
            TypedQuery<Ficha> query = em.createQuery(cq);
            return query.getResultList();
        } catch (Exception e) {
            System.out.println("Erro print " + e);
            return null;
        }
    }
}
